package(
    default_visibility = ["//visibility:public"],
    licenses = ["notice"],
)

################################################################################
#  PUBLIC HEADER
################################################################################

cc_library(
    name = "simd",
    hdrs = ["simd.h"],
    tags = ["local"],
    deps = [
        ":attributes",
        ":avx1",
        ":avx2",
        ":avx512",
        ":fallback",
        ":flags",
        ":sse4",
    ],
)

################################################################################
#  FMA (FusedMultiplyAdd)
################################################################################

cc_library(
    name = "fma",
    hdrs = ["fma.h"],
    tags = ["local"],
    textual_hdrs = ["fma.inc"],
    deps = [
        ":simd",
        "//scann/utils:index_sequence",
    ],
)

################################################################################
#  Horizontal sum
################################################################################

cc_library(
    name = "horizontal_sum",
    hdrs = ["horizontal_sum.h"],
    tags = ["local"],
    deps = [
        ":simd",
    ],
)

################################################################################
#  Shared impl helpers.
################################################################################

cc_library(
    name = "flags",
    srcs = ["flags.cc"],
    hdrs = ["flags.h"],
    tags = ["local"],
    deps = [
        "//scann/oss_wrappers:tf_dependency",
        "//scann/utils:common",
        "//scann/utils:types",
        "@com_google_absl//absl/base",
        "@com_google_absl//absl/flags:flag",
    ],
)

cc_library(
    name = "attributes",
    hdrs = ["attributes.h"],
    tags = ["local"],
)

################################################################################
#  fallback
################################################################################

cc_library(
    name = "fallback",
    hdrs = ["fallback.h"],
    tags = ["local"],
    deps = [
        ":attributes",
        ":flags",
        "//scann/utils:index_sequence",
        "//scann/utils:types",
    ],
)

################################################################################
#  sse4
################################################################################

cc_library(
    name = "sse4",
    hdrs = ["sse4.h"],
    tags = ["local"],
    deps = [
        ":attributes",
        ":flags",
        "//scann/utils:index_sequence",
        "//scann/utils:types",
    ],
)

################################################################################
#  avx1
################################################################################

cc_library(
    name = "avx1",
    hdrs = ["avx1.h"],
    tags = ["local"],
    deps = [
        ":attributes",
        ":flags",
        ":sse4",
        "//scann/utils:index_sequence",
        "//scann/utils:types",
    ],
)

################################################################################
#  avx2
################################################################################

cc_library(
    name = "avx2",
    hdrs = ["avx2.h"],
    tags = ["local"],
    deps = [
        ":attributes",
        ":avx1",
        ":flags",
        "//scann/utils:index_sequence",
        "//scann/utils:types",
    ],
)

################################################################################
#  avx512
################################################################################

cc_library(
    name = "avx512",
    hdrs = ["avx512.h"],
    tags = ["local"],
    deps = [
        ":attributes",
        ":avx2",
        ":flags",
        "//scann/utils:index_sequence",
        "//scann/utils:types",
    ],
)
